home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
preconv.s
< prev
next >
Wrap
Text File
|
2000-01-10
|
49KB
|
2,002 lines
.include fefunc.h
.include global.mac
.include preconv.mac
;----------------------------------------------------------------
;バスブースター
; 現在のポイントのPCMの値に2^BASS_INPUT_SHIFT_LEFTを掛け,
; 現在のポイントの前後合わせてBASS_RING_SAMPLE個のPCMの値の合計を加え,
; 2^BASS_OUTPUT_SHIFT_RIGHTで割る.
BASS_RING_SAMPLE equ 95 ;中央の値が必要なので奇数にすること
BASS_INPUT_SHIFT_LEFT equ 6
BASS_OUTPUT_SHIFT_RIGHT equ 6
.fail (BASS_RING_SAMPLE.and.1)=0
BASS_RING_SIZE equ 4*BASS_RING_SAMPLE
;----------------------------------------------------------------
;ハイカットフィルタ
; 現在のポイントの前後合わせてHICUT_RING_SAMPLE個のPCMの値の合計を
; 2^HICUT_OUTPUT_SHIFT_RIGHTで割る.
HICUT_RING_SAMPLE equ 4 ;中央の値は不要なので奇数でなくてよい
HICUT_OUTPUT_SHIFT_RIGHT equ 2
HICUT_RING_SIZE equ 4*HICUT_RING_SAMPLE
;----------------------------------------------------------------
;----------------------------------------------------------------
;PCMデータの前処理(PCMデータをOPMのTLの並びに変換する)の初期化
.text
.align 4,$2048
init_preconv::
movem.l d0-d1/a0,-(sp)
* clr.l preconv_dat_0
clr.l preconv_dat_1
clr.l preconv_dat_2
* clr.w preconv_pre_0
clr.w preconv_pre_1
clr.w preconv_pre_2
* move.w #$8000,preconv_for_0
move.w #$8000,preconv_for_1
move.w #$8000,preconv_for_2
* move.w #$8000,preconv_bak_0
move.w #$8000,preconv_bak_1
move.w #$8000,preconv_bak_2
* clr.l preconv_jmp_0
clr.l preconv_jmp_1
clr.l preconv_jmp_2
tst.b adpcm_data_flag
bne 19f
tst.b fmp_data_flag
bne 19f
tst.b cdxa_data_flag
bne 19f
tst.b xx_data_flag
bne 19f
tst.b bass_flag
beq 9f
move.l #bass_ring_buffer,preconv_bass_rngred
move.l #bass_ring_buffer+BASS_RING_SIZE/2,preconv_bass_rngwrt
clr.l preconv_bass_left
clr.l preconv_bass_right
lea.l bass_ring_buffer,a0
moveq.l #0,d0
move.l #BASS_RING_SIZE/4-1,d1
swap.w d1
2: swap.w d1
1: move.l d0,(a0)+
dbra d1,1b
swap.w d1
dbra d1,2b
lea.l (m_use_bass,pc),a0
bsr silent_eprintcrlf
9:
tst.b hicut_flag
beq 9f
move.l #hicut_ring_buffer,preconv_hicut_rngred
move.l #hicut_ring_buffer+HICUT_RING_SIZE/2,preconv_hicut_rngwrt
clr.l preconv_hicut_left
clr.l preconv_hicut_right
lea.l hicut_ring_buffer,a0
moveq.l #0,d0
move.l #HICUT_RING_SIZE/4-1,d1
swap.w d1
2: swap.w d1
1: move.l d0,(a0)+
dbra d1,1b
swap.w d1
dbra d1,2b
lea.l (m_use_hicut,pc),a0
bsr silent_eprintcrlf
9:
19:
* clr.l preconv_scnt_0
clr.l preconv_scnt_1
move.l output_frequency,d0 ;出力側のサンプリング周波数
FPACK __LTOF
move.l d0,d1
move.l data_frequency,d0 ;入力側のサンプリング周波数
FPACK __LTOF
add.l #$08000000,d0 ;65536倍
FPACK __FDIV
FPACK __FTOL ;入力側のサンプリング周波数
; /出力側のサンプリング周波数*65536
move.l d0,speed_rate
lsr.l #1,d0
move.l d0,preconv_scnt_2
clr.w preconv_rest_1
clr.w preconv_rest_2
;-sqで使う定数
;2^(n-1)<=@srat<2^nとなるnを求める
move.l speed_rate,d0
moveq.l #32,d1
@@: add.l d0,d0
dbcs d1,@b ;speed_rateは0ではないので必ず途中で止まる
move.w d1,sq_n ;n
sub.w #16,d1
move.w d1,sq_n_16 ;n-16
;2^(n+14)/speed_rateを求める
move.l speed_rate,d0
FPACK __LTOF
move.l d0,d1
move.w sq_n,d0
add.w #$7F+14,d0
lsl.w #7,d0
swap.w d0
clr.w d0 ;2^(n+14)
FPACK __FDIV
FPACK __FTOL
move.w d0,sq_inv ;2^(n+14)/speed_rate
;ADPCM
tst.b adpcm_data_flag
beq @f
bsr init_adpcm
@@:
tst.b xx_data_flag
beq @f
clr.l left1
clr.l left2
clr.l right1
clr.l right2
@@:
tst.b silent_flag
bne 9f
lea.l (m_frequency_1,pc),a0
bsr eprint
move.l data_frequency,d0 ;入力側のサンプリング周波数
bsr utos_eprint
lea.l (m_frequency_2,pc),a0
bsr eprint
lea.l (m_mono,pc),a0
tst.b mono_data_flag
bne @f
lea.l (m_stereo,pc),a0
@@: bsr eprint
lea.l (m_frequency_3,pc),a0
bsr eprint
tst.b fmp_data_flag
bne 8f
lea.l (m_frequency_4,pc),a0
bsr eprint
move.l output_frequency,d0 ;出力側のサンプリング周波数
bsr utos_eprint
lea.l (m_frequency_2,pc),a0
bsr eprint
lea.l (m_mono,pc),a0
tst.b mono_play_flag
bne @f
lea.l (m_stereo,pc),a0
@@: bsr eprint
lea.l (m_frequency_3,pc),a0
bsr eprint
lea.l (m_frequency_5,pc),a0
bsr eprint
lea.l (m_low_quality,pc),a0
move.b data_quality,d0
beq @f
lea.l (m_high_quality,pc),a0
subq.b #1,d0
beq @f
lea.l (m_super_quality,pc),a0
@@: bsr eprint
lea.l (m_frequency_6,pc),a0
bsr eprint
8: bsr ecrlf
9:
;
movem.l (sp)+,d0-d1/a0
rts
m_use_bass: .dc.b 'バスブースターを使用します',0
m_use_hicut: .dc.b 'ハイカットフィルタを使用します',0
m_frequency_1: .dc.b 'サンプリング周波数: ',0
m_frequency_2: .dc.b 'Hz(',0
m_frequency_3: .dc.b ')',0
m_frequency_4: .dc.b ' → ',0
m_frequency_5: .dc.b ' <',0
m_frequency_6: .dc.b '>',0
m_mono: .dc.b 'Mono',0
m_stereo: .dc.b 'Stereo',0
m_low_quality: .dc.b 'Low Quality',0
m_high_quality: .dc.b 'High Quality',0
m_super_quality: .dc.b 'Super Quality',0
.even
.bss
.align 4
preconv_dat_0::
preconv_dat_1:: .ds.l 1
preconv_dat_2:: .ds.l 1
.even
preconv_pre_0::
preconv_pre_1:: .ds.w 1
preconv_pre_2:: .ds.w 1
preconv_for_0::
preconv_for_1:: .ds.w 1
preconv_for_2:: .ds.w 1
preconv_bak_0::
preconv_bak_1:: .ds.w 1
preconv_bak_2:: .ds.w 1
.align 4
preconv_jmp_0::
preconv_jmp_1:: .ds.l 1
preconv_jmp_2:: .ds.l 1
.align 4
preconv_scnt_0::
preconv_scnt_1:: .ds.l 1
preconv_scnt_2:: .ds.l 1
speed_rate:: .ds.l 1 ;入力側のサンプリング周波数
; /出力側のサンプリング周波数*65536
;周波数が上がる=間隔が短くなるとき65536より小さい
;周波数が下がる=間隔が長くなるとき65536より大きい
.even
preconv_rest_1:: .ds.b 1 ;0=left繰り越しなし,-1=left繰り越しあり
.ds.b 1 ;left繰り越しデータ
preconv_rest_2:: .ds.b 1 ;0=right繰り越しなし,-1=right繰り越しあり
.ds.b 1 ;right繰り越しデータ
;-sq
.even
sq_n:: .ds.w 1 ;n
sq_n_16:: .ds.w 1 ;n-16
sq_inv:: .ds.w 1 ;2^(n+14)/speed_rate
.bss
.align 4
left1:: .ds.l 1 ;1つ前のleftのデータ
left2:: .ds.l 1 ;2つ前のleftのデータ
right1:: .ds.l 1 ;1つ前のrightのデータ
right2:: .ds.l 1 ;2つ前のrightのデータ
;----------------------------------------------------------------
; Signed-16bit整数同士を足して2で割る
; + + vs,cc 0を押し込んで右シフト(lsr)
; + + vc asr
; + - vc asr
; - + vc asr
; - - vc asr
; - - vs,cs 1を押し込んで右シフト
;----------------------------------------------------------------
;----------------------------------------------------------------
;PCMデータの前処理(PCMデータをOPMのTLの並びに変換する)
;<a0.l:出力バッファの先頭
;<a1.l:入力データの先頭
;<a2.l:入力データの末尾+1
;>a0.l:出力データの末尾+1
;>a1.l:出力データの先頭
;?d1-d7/a2-a6
.text
;----------------------------------------------------------------
;ノーマル
START_PRECONV_BUFFER .macro side
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→ステレオ,16bit,big-endian
GET_DATA_1 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
GET_DATA_2 .macro src,dat,tmp
addq.l #2,src
move.w (src)+,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_ss16b_stereo_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_STEREO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
;ステレオ→モノラル,16bit,big-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
add.w (src)+,dat
bvc @skip
@over:
roxr.w #1,dat ;常にvc
bra @done
@skip:
asr.w #1,dat ;常にvc
@done:
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_ss16b_mono_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
;モノラル→モノラル,16bit,big-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat ;常にvc
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_ms16b_mono_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
;ステレオ→ステレオ,16bit,little-endian
GET_DATA_1 .macro src,dat,tmp
move.w (src)+,dat
rol.w #8,dat
addq.l #2,src
.endm
GET_DATA_2 .macro src,dat,tmp
addq.l #2,src
move.w (src)+,dat
rol.w #8,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_ss16l_stereo_%q::
.if TEST_68000
bra preconv_ss16b_stereo_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_ss16b_stereo_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_STEREO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
;ステレオ→モノラル,16bit,little-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
move.w (src)+,tmp
rol.w #8,dat
rol.w #8,tmp
add.w tmp,dat
bvc @skip
@over:
roxr.w #1,dat ;常にvc
bra @done
@skip:
asr.w #1,dat ;常にvc
@done:
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_ss16l_mono_%q::
.if TEST_68000
bra preconv_ss16b_mono_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_ss16b_mono_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
;モノラル→モノラル,16bit,little-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
rol.w #8,dat ;常にvc
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_ms16l_mono_%q::
.if TEST_68000
bra preconv_ms16b_mono_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_ms16b_mono_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
;FMPフォーマット(変換する必要がない)
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_sfmp_stereo_%q::
preconv_sfmp_mono_%q::
preconv_mfmp_mono_%q::
movea.l a2,a0
* movea.l a1,a1
rts
.endm
.bss
.align 4
preconv_dst_top_ptr:: .ds.l 1
preconv_src_cur_ptr:: .ds.l 1
preconv_src_lim_ptr:: .ds.l 1
;----------------------------------------------------------------
;バスブースター
START_PRECONV_BUFFER .macro side
.if side<2
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_bass_rngred,@Arngred
movea.l preconv_bass_rngwrt,@Arngwrt
move.l #bass_ring_buffer,@Rrngtop
move.l #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
move.l preconv_bass_left,@Dleft
move.l preconv_bass_right,@Dright
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;right
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dright
move.w (@Adatptr),@Ddat
ext.l @Ddat
add.l @Ddat,@Dright
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_bass_rngred
move.l @Arngwrt,preconv_bass_rngwrt
move.l @Dleft,preconv_bass_left
move.l @Dright,preconv_bass_right
;
.endif
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→ステレオ,16bit,big-endian
GET_DATA_1 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
GET_DATA_2 .macro src,dat,tmp
addq.l #2,src
move.w (src)+,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_bass_ss16b_stereo_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_STEREO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_bass_rngred,@Arngred
movea.l preconv_bass_rngwrt,@Arngwrt
move.l #bass_ring_buffer,@Rrngtop
move.l #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
move.l preconv_bass_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
add.w (2,@Adatptr),@Ddat
bvc @_11
roxr.w #1,@Ddat
bra @_12
@_11:
asr.w #1,@Ddat
@_12:
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_bass_rngred
move.l @Arngwrt,preconv_bass_rngwrt
move.l @Dleft,preconv_bass_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→モノラル,16bit,big-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_bass_ss16b_mono_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_bass_rngred,@Arngred
movea.l preconv_bass_rngwrt,@Arngwrt
move.l #bass_ring_buffer,@Rrngtop
move.l #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
move.l preconv_bass_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_bass_rngred
move.l @Arngwrt,preconv_bass_rngwrt
move.l @Dleft,preconv_bass_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;モノラル→モノラル,16bit,big-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat ;常にvc
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_bass_ms16b_mono_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
.if side<2
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_bass_rngred,@Arngred
movea.l preconv_bass_rngwrt,@Arngwrt
move.l #bass_ring_buffer,@Rrngtop
move.l #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
move.l preconv_bass_left,@Dleft
move.l preconv_bass_right,@Dright
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;right
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dright
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
ext.l @Ddat
add.l @Ddat,@Dright
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_bass_rngred
move.l @Arngwrt,preconv_bass_rngwrt
move.l @Dleft,preconv_bass_left
move.l @Dright,preconv_bass_right
;
.endif
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→ステレオ,16bit,little-endian
GET_DATA_1 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
GET_DATA_2 .macro src,dat,tmp
addq.l #2,src
move.w (src)+,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_bass_ss16l_stereo_%q::
.if TEST_68000
bra preconv_bass_ss16b_stereo_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_bass_ss16b_stereo_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_STEREO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_bass_rngred,@Arngred
movea.l preconv_bass_rngwrt,@Arngwrt
move.l #bass_ring_buffer,@Rrngtop
move.l #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
move.l preconv_bass_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
move.w (2,@Adatptr),@Dtmp
rol.w #8,@Dtmp
add.w @Dtmp,@Ddat
bvc @_11
roxr.w #1,@Ddat
bra @_12
@_11:
asr.w #1,@Ddat
@_12:
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_bass_rngred
move.l @Arngwrt,preconv_bass_rngwrt
move.l @Dleft,preconv_bass_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→モノラル,16bit,little-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_bass_ss16l_mono_%q::
.if TEST_68000
bra preconv_bass_ss16b_mono_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_bass_ss16b_mono_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_bass_rngred,@Arngred
movea.l preconv_bass_rngwrt,@Arngwrt
move.l #bass_ring_buffer,@Rrngtop
move.l #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
move.l preconv_bass_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
move.w (@Arngred)+,@Ddat
ext.l @Ddat
asl.l #BASS_INPUT_SHIFT_LEFT,@Ddat
add.l @Dleft,@Ddat
asr.l #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_bass_rngred
move.l @Arngwrt,preconv_bass_rngwrt
move.l @Dleft,preconv_bass_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;モノラル→モノラル,16bit,little-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_bass_ms16l_mono_%q::
.if TEST_68000
bra preconv_bass_ms16b_mono_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_bass_ms16b_mono_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
.bss
.align 4
preconv_bass_rngred: .ds.l 1 ;bass_ring_buffer
preconv_bass_rngwrt: .ds.l 1 ;bass_ring_buffer+BASS_RING_SIZE/2
preconv_bass_left: .ds.l 1 ;0
preconv_bass_right: .ds.l 1 ;0
.align 4
bass_ring_buffer: .ds.b BASS_RING_SIZE ;0
;----------------------------------------------------------------
;ハイカットフィルタ
START_PRECONV_BUFFER .macro side
.if side<2
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_hicut_rngred,@Arngred
movea.l preconv_hicut_rngwrt,@Arngwrt
move.l #hicut_ring_buffer,@Rrngtop
move.l #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
move.l preconv_hicut_left,@Dleft
move.l preconv_hicut_right,@Dright
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dleft,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;right
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dright
move.w (@Adatptr),@Ddat
ext.l @Ddat
add.l @Ddat,@Dright
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dright,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_hicut_rngred
move.l @Arngwrt,preconv_hicut_rngwrt
move.l @Dleft,preconv_hicut_left
move.l @Dright,preconv_hicut_right
;
.endif
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→ステレオ,16bit,big-endian
GET_DATA_1 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
GET_DATA_2 .macro src,dat,tmp
addq.l #2,src
move.w (src)+,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_hicut_ss16b_stereo_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_STEREO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_hicut_rngred,@Arngred
movea.l preconv_hicut_rngwrt,@Arngwrt
move.l #hicut_ring_buffer,@Rrngtop
move.l #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
move.l preconv_hicut_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
add.w (2,@Adatptr),@Ddat
bvc @_11
roxr.w #1,@Ddat
bra @_12
@_11:
asr.w #1,@Ddat
@_12:
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dleft,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_hicut_rngred
move.l @Arngwrt,preconv_hicut_rngwrt
move.l @Dleft,preconv_hicut_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→モノラル,16bit,big-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_hicut_ss16b_mono_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_hicut_rngred,@Arngred
movea.l preconv_hicut_rngwrt,@Arngwrt
move.l #hicut_ring_buffer,@Rrngtop
move.l #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
move.l preconv_hicut_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dleft,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_hicut_rngred
move.l @Arngwrt,preconv_hicut_rngwrt
move.l @Dleft,preconv_hicut_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;モノラル→モノラル,16bit,big-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat ;常にvc
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_hicut_ms16b_mono_%q::
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
.if side<2
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_hicut_rngred,@Arngred
movea.l preconv_hicut_rngwrt,@Arngwrt
move.l #hicut_ring_buffer,@Rrngtop
move.l #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
move.l preconv_hicut_left,@Dleft
move.l preconv_hicut_right,@Dright
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dleft,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;right
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dright
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
ext.l @Ddat
add.l @Ddat,@Dright
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dright,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_hicut_rngred
move.l @Arngwrt,preconv_hicut_rngwrt
move.l @Dleft,preconv_hicut_left
move.l @Dright,preconv_hicut_right
;
.endif
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→ステレオ,16bit,little-endian
GET_DATA_1 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
GET_DATA_2 .macro src,dat,tmp
addq.l #2,src
move.w (src)+,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_hicut_ss16l_stereo_%q::
.if TEST_68000
bra preconv_hicut_ss16b_stereo_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_hicut_ss16b_stereo_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_STEREO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_hicut_rngred,@Arngred
movea.l preconv_hicut_rngwrt,@Arngwrt
move.l #hicut_ring_buffer,@Rrngtop
move.l #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
move.l preconv_hicut_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
move.w (2,@Adatptr),@Dtmp
rol.w #8,@Dtmp
add.w @Dtmp,@Ddat
bvc @_11
roxr.w #1,@Ddat
bra @_12
@_11:
asr.w #1,@Ddat
@_12:
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dleft,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_hicut_rngred
move.l @Arngwrt,preconv_hicut_rngwrt
move.l @Dleft,preconv_hicut_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;ステレオ→モノラル,16bit,little-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
addq.l #2,src
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_hicut_ss16l_mono_%q::
.if TEST_68000
bra preconv_hicut_ss16b_mono_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_hicut_ss16b_mono_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
START_PRECONV_BUFFER .macro side
@Ddat reg Ddat ;データ
@Dtmp reg Dtmp ;テンポラリ
@Adatlim reg Alim ;データの末尾
@Adatptr reg Asrc ;バッファ上で次に使用するデータの位置
@Arngred reg Ajmp ;リングバッファ上で次に使用するデータの位置
@Arngwrt reg Adst ;リングバッファの書き込みポインタ
@Rrngtop reg Rpre ;リングバッファの先頭
@Rrngbtm reg Rbak ;リングバッファの末尾
@Dleft reg Dscnt ;リングバッファ上のleftのデータの和
@Dright reg Dtop ;リングバッファ上のrightのデータの和
@Rmin reg Rsrat ;-32768
@Rmax reg Rsone ;32767
movea.l preconv_src_lim_ptr,@Adatlim
movea.l preconv_src_cur_ptr,@Adatptr
movea.l preconv_hicut_rngred,@Arngred
movea.l preconv_hicut_rngwrt,@Arngwrt
move.l #hicut_ring_buffer,@Rrngtop
move.l #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
move.l preconv_hicut_left,@Dleft
move.l #-32768,@Rmin
move.l #32767,@Rmax
@_10:
;left
move.w (@Arngwrt),@Ddat
ext.l @Ddat
sub.l @Ddat,@Dleft
move.w (@Adatptr),@Ddat
rol.w #8,@Ddat
ext.l @Ddat
add.l @Ddat,@Dleft
move.w @Ddat,(@Arngwrt)+
addq.l #2,@Arngred
move.l @Dleft,@Ddat
asr.l #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
cmp.l @Rmin,@Ddat
bge @f
move.l @Rmin,@Ddat
@@: cmp.l @Rmax,@Ddat
ble @f
move.l @Rmax,@Ddat
@@:
move.w @Ddat,(@Adatptr)+
;
addq.l #2,@Arngred
addq.l #2,@Arngwrt
addq.l #2,@Adatptr
;
cmpa.l @Rrngbtm,@Arngred
blo @f
movea.l @Rrngtop,@Arngred
@@:
;
cmpa.l @Rrngbtm,@Arngwrt
blo @f
movea.l @Rrngtop,@Arngwrt
@@:
;
cmpa.l @Adatlim,@Adatptr
blo @_10
;
move.l @Arngred,preconv_hicut_rngred
move.l @Arngwrt,preconv_hicut_rngwrt
move.l @Dleft,preconv_hicut_left
;
movea.l preconv_dst_top_ptr,Adst
movea.l preconv_src_cur_ptr,Asrc
movea.l preconv_src_lim_ptr,Alim
.endm
LOOP_PRECONV_BUFFER .macro side
.endm
;モノラル→モノラル,16bit,little-endian
GET_DATA_0 .macro src,dat,tmp
move.w (src)+,dat
.endm
.irp %q,LQ,HQ,SQ
.text
.align 4,$2048
preconv_hicut_ms16l_mono_%q::
.if TEST_68000
bra preconv_hicut_ms16b_mono_%q ;68000のときはエンディアン変換済み
.else
IS68000 d0
beq preconv_hicut_ms16b_mono_%q ;68000のときはエンディアン変換済み
.endif
move.l a0,preconv_dst_top_ptr
move.l a1,preconv_src_cur_ptr
move.l a2,preconv_src_lim_ptr
PRECONV_MONO_%q
movea.l preconv_dst_top_ptr,a1
rts
.endm
.bss
.align 4
preconv_hicut_rngred: .ds.l 1 ;hicut_ring_buffer
preconv_hicut_rngwrt: .ds.l 1 ;hicut_ring_buffer+HICUT_RING_SIZE/2
preconv_hicut_left: .ds.l 1 ;0
preconv_hicut_right: .ds.l 1 ;0
.align 4
hicut_ring_buffer: .ds.b HICUT_RING_SIZE ;0
;----------------------------------------------------------------
;----------------------------------------------------------------
;PCM→OPM変換テーブルを作る
; L=10^(-0.75/20*TL)
.text
.align 4,$2048
make_table::
movem.l d1-d7/a0-a3,-(sp)
.if 0
lea.l (m_make_table,pc),a0
bsr silent_eprint
.endif
lea.l (half_tl_table,pc),a2 ;126.5~0.5
lea.l pcm2tl_table+32768,a0 ;a0は0~32767
lea.l (1,a0),a1 ;a1は0~-32768だが,-(a1)で書き込むので初期値は1
move.l volume,d0
FPACK __LTOF
move.l d0,d1
move.l #$41800000,d0 ;16.0
FPACK __FDIV
move.l d0,d7 ;VOL
move.w #32768-1,d6
moveq.l #127,d5
move.l #$3F800000,d3 ;1.0
moveq.l #0,d2 ;0.0~32767.0
bra 2f
1: subq.b #1,d5 ;番兵があるので必ず止まる
2: move.l (a2)+,d0
move.l d7,d1
FPACK __FMUL
move.l d0,d4
3: cmp.l d4,d2 ;.sだが正の数なのでcmp.lで比較できる
bhs 1b
4: move.b d5,(a0)+ ;0~32767
move.b d5,-(a1) ;0~-32767
move.l d2,d0
move.l d3,d1
FPACK __FADD
move.l d0,d2
dbra d6,3b
;0~32767と0~-32767が完成,-32768が残っている
cmp.l d4,d0
blo 5f
tst.b d5
beq 5f
subq.b #1,d5
5: move.b d5,-(a1)
.if 0
bsr silent_ecrlf
.endif
movem.l (sp)+,d1-d7/a0-a3
rts
m_make_table: .dc.b 'PCM → OPM 変換テーブルを作っています',0
.even
;(L(TL)-L(127))*32768のテーブル
; L(TL):=10^(-0.75/20*TL)
.align 4,$2048
half_tl_table:
.dc.s 0.0249790331564598439725118169021/VOL ;TL=126.5
.dc.s 0.0782918709331476020763667840649/VOL ;TL=125.5
.dc.s 0.136412699922336602786363931527/VOL ;TL=124.5
.dc.s 0.199775126370918425052560396896/VOL ;TL=123.5
.dc.s 0.268851861085055585204731577729/VOL ;TL=122.5
.dc.s 0.344158246055009330577173283454/VOL ;TL=121.5
.dc.s 0.426256099126837360489754730109/VOL ;TL=120.5
.dc.s 0.515757905403856993662565002971/VOL ;TL=119.5
.dc.s 0.613331386647521673665138088852/VOL ;TL=118.5
.dc.s 0.719704482767396026166953362516/VOL ;TL=117.5
.dc.s 0.835670782564275638328249586056/VOL ;TL=116.5
.dc.s 0.962095444242118369519663701653/VOL ;TL=115.5
.dc.s 1.09992164985833884739083589277/VOL ;TL=114.5
.dc.s 1.25017764186542639810460404596/VOL ;TL=113.5
.dc.s 1.41398439423949693643416771827/VOL ;TL=112.5
.dc.s 1.59256397542567932912798377748/VOL ;TL=111.5
.dc.s 1.78724866549148627199992039775/VOL ;TL=110.5
.dc.s 1.9994908955060339169251943125/VOL ;TL=109.5
.dc.s 2.2308740832971310441830848046/VOL ;TL=108.5
.dc.s 2.48312444642562093035569302004/VOL ;TL=107.5
.dc.s 2.7581238805068177961204790857/VOL ;TL=106.5
.dc.s 3.05792399895682477259486919328/VOL ;TL=105.5
.dc.s 3.38476143890624676944056994051/VOL ;TL=104.5
.dc.s 3.74107454746996202854224690479/VOL ;TL=103.5
.dc.s 4.12952157285966282655455833564/VOL ;TL=102.5
.dc.s 4.55300049605264658143806178966/VOL ;TL=101.5
.dc.s 5.01467065096959003491609135695/VOL ;TL=100.5
.dc.s 5.51797629445708127579538962277/VOL ;TL=99.5
.dc.s 6.06667230191706194013552490339/VOL ;TL=98.5
.dc.s 6.66485218028356717258122173868/VOL ;TL=97.5
.dc.s 7.31697860733555307749532837661/VOL ;TL=96.5
.dc.s 8.02791672518214930438951651899/VOL ;TL=95.5
.dc.s 8.80297043630397886950532805413/VOL ;TL=94.5
.dc.s 9.64792197293453999512298113455/VOL ;TL=93.5
.dc.s 10.5690750349861618635689602561/VOL ;TL=92.5
.dc.s 11.5733018183479152381211218609/VOL ;TL=91.5
.dc.s 12.6680942844066978898191874225/VOL ;TL=90.5
.dc.s 13.8616200532840539420906962171/VOL ;TL=89.5
.dc.s 15.1627833377761835296985297871/VOL ;TL=88.5
.dc.s 16.5812913725904012546005717612/VOL ;TL=87.5
.dc.s 18.1277268344685641792656189175/VOL ;TL=86.5
.dc.s 19.8136267934825696418567047588/VOL ;TL=85.5
.dc.s 21.6515687845123606900904016501/VOL ;TL=84.5
.dc.s 23.6552646410364842728276505249/VOL ;TL=83.5
.dc.s 25.8396627912754194945564937378/VOL ;TL=82.5
.dc.s 28.2210597798606648847674248799/VOL ;TL=81.5
.dc.s 30.8172218470289422448988826375/VOL ;TL=80.5
.dc.s 33.6475174723743143620728005205/VOL ;TL=79.5
.dc.s 36.7330618719913062790308049138/VOL ;TL=78.5
.dc.s 40.0968745270195300569385457903/VOL ;TL=77.5
.dc.s 43.7640509188201426903516795659/VOL ;TL=76.5
.dc.s 47.7619497520020175495666327316/VOL ;TL=75.5
.dc.s 52.1203970620614939019679680501/VOL ;TL=74.5
.dc.s 56.8719087303660091704604737974/VOL ;TL=73.5
.dc.s 62.0519330665385781521145446469/VOL ;TL=72.5
.dc.s 67.6991152680114780690122777743/VOL ;TL=71.5
.dc.s 73.8555857297305391028174139176/VOL ;TL=70.5
.dc.s 80.567274354923766077463525079/VOL ;TL=69.5
.dc.s 87.884253211827079467601961444/VOL ;TL=68.5
.dc.s 95.8611100927329297097983146142/VOL ;TL=67.5
.dc.s 104.557355762272086666604989389/VOL ;TL=66.5
.dc.s 114.037867933174996988874096728/VOL ;TL=65.5
.dc.s 124.373375281761810792360717713/VOL ;TL=64.5
.dc.s 135.640985114123682928968241141/VOL ;TL=63.5
.dc.s 147.924758619610783711874040175/VOL ;TL=62.5
.dc.s 161.316338003264118662012682439/VOL ;TL=61.5
.dc.s 175.91563017586737016906831082/VOL ;TL=60.5
.dc.s 191.831552102239013254268117846/VOL ;TL=59.5
.dc.s 209.182843368381805915081516772/VOL ;TL=58.5
.dc.s 228.098952029588185086788174853/VOL ;TL=57.5
.dc.s 248.721000348307378065894196923/VOL ;TL=56.5
.dc.s 271.202837626591836473127625685/VOL ;TL=55.5
.dc.s 295.712187987703418455479657691/VOL ;TL=54.5
.dc.s 322.431901669821093416624163188/VOL ;TL=53.5
.dc.s 351.561319167036500802735824364/VOL ;TL=52.5
.dc.s 383.317758394712735100073451992/VOL ;TL=51.5
.dc.s 417.938135974096105603800981463/VOL ;TL=50.5
.dc.s 455.680734731657619560311176809/VOL ;TL=49.5
.dc.s 496.827130599465368014126536802/VOL ;TL=48.5
.dc.s 541.684293292088871985834879115/VOL ;TL=47.5
.dc.s 590.586876431983712271424749932/VOL ;TL=46.5
.dc.s 643.899714208671470375279717095/VOL ;TL=45.5
.dc.s 702.020543197860471085276864557/VOL ;TL=44.5
.dc.s 765.382969646442293351473329926/VOL ;TL=43.5
.dc.s 834.459704360579453503644510759/VOL ;TL=42.5
.dc.s 909.766089330533198876086216484/VOL ;TL=41.5
.dc.s 991.863942402361228788667663138/VOL ;TL=40.5
.dc.s 1081.365748679380861961477936/VOL ;TL=39.5
.dc.s 1178.93922992304554196405102188/VOL ;TL=38.5
.dc.s 1285.31232604291989446586629555/VOL ;TL=37.5
.dc.s 1401.27862583979950662716251909/VOL ;TL=36.5
.dc.s 1527.70328751764223781857663468/VOL ;TL=35.5
.dc.s 1665.5294931338627156897488258/VOL ;TL=34.5
.dc.s 1815.78548514095026640351697899/VOL ;TL=33.5
.dc.s 1979.5922375150208047330806513/VOL ;TL=32.5
.dc.s 2158.17181870120319742689671051/VOL ;TL=31.5
.dc.s 2352.85650876701014029883333078/VOL ;TL=30.5
.dc.s 2565.09873878155778522410724553/VOL ;TL=29.5
.dc.s 2796.48192657265491248199773763/VOL ;TL=28.5
.dc.s 3048.73228970114479865460595307/VOL ;TL=27.5
.dc.s 3323.73172378234166441939201873/VOL ;TL=26.5
.dc.s 3623.53184223234864089378212631/VOL ;TL=25.5
.dc.s 3950.36928218177063773948287354/VOL ;TL=24.5
.dc.s 4306.68239074548589684115983782/VOL ;TL=23.5
.dc.s 4695.12941613518669485347126867/VOL ;TL=22.5
.dc.s 5118.60833932817044973697472269/VOL ;TL=21.5
.dc.s 5580.27849424511390321500428998/VOL ;TL=20.5
.dc.s 6083.5841377326051440943025558/VOL ;TL=19.5
.dc.s 6632.28014519258580843443783642/VOL ;TL=18.5
.dc.s 7230.46002355909104088013467171/VOL ;TL=17.5
.dc.s 7882.58645061107694579424130964/VOL ;TL=16.5
.dc.s 8593.52456845767317268842945202/VOL ;TL=15.5
.dc.s 9368.57827957950273780424098716/VOL ;TL=14.5
.dc.s 10213.5298162100638634218940676/VOL ;TL=13.5
.dc.s 11134.6828782616857318678731891/VOL ;TL=12.5
.dc.s 12138.9096616234391064200347939/VOL ;TL=11.5
.dc.s 13233.7021276822217581181003555/VOL ;TL=10.5
.dc.s 14427.2278965595778103896091502/VOL ;TL=9.5
.dc.s 15728.3911810517073979974427202/VOL ;TL=8.5
.dc.s 17146.8992158659251228994846942/VOL ;TL=7.5
.dc.s 18693.3346777440880475645318505/VOL ;TL=6.5
.dc.s 20379.2346367580935101556176918/VOL ;TL=5.5
.dc.s 22217.1766277878845583893145831/VOL ;TL=4.5
.dc.s 24220.8724843120081411265634579/VOL ;TL=3.5
.dc.s 26405.2706345509433628554066708/VOL ;TL=2.5
.dc.s 28786.6676231361887530663378129/VOL ;TL=1.5
;0は使わない
* .dc.s 31382.8296903044661131977955705/VOL ;TL=0.5
.dc.s 9999999999.0 ;番兵
.bss
;PCM→OPM変換テーブル
pcm2tl_table:: .ds.b 65536